package com.xy.biz.rs.client;

import com.xy.biz.rs.domain.req.GetRecordTemplateRequest;
import com.xy.biz.rs.domain.req.GroupRecordTemplateRequest;
import com.xy.biz.rs.domain.resp.GetRecordTemplateGroupResponse;
import com.xy.biz.rs.domain.resp.GetRecordTemplateResponse;
import com.xy.lang.domain.Result;
import com.xy.lang.util.ResultUtils;
import org.springframework.util.CollectionUtils;

import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author Greekn Zhang
 * @date 2022/2/15 13:55
 * @description
 */
public interface RecordTemplateClient {
    Result<List<GetRecordTemplateGroupResponse>> listRecordTemplateGroupByTemplateId(GetRecordTemplateRequest request);

    Result<Map<Long, List<GetRecordTemplateGroupResponse>>> groupRecordTemplateGroupByTemplateId(GroupRecordTemplateRequest request);

    Result<List<GetRecordTemplateResponse>> listRecordTemplateId(Collection<Long> collection);

    default <T> void buildByRecordTemplate(Collection<T> source,
                                           Collection<Long> recordTemplateIdList,
                                           Function<T, Long> recordTemplateIdGetter,
                                           BiConsumer<T, GetRecordTemplateResponse> builder
    ) {
        Objects.requireNonNull(recordTemplateIdGetter, "The recordTemplateIdGetter is required.");
        Objects.requireNonNull(builder, "The builder is required.");
        if (CollectionUtils.isEmpty(source)) {
            return;
        }
        if (CollectionUtils.isEmpty(recordTemplateIdList)) {
            return;
        }
        Set<Long> recordTemplateIdSet = new HashSet<>(recordTemplateIdList);
        Result<List<GetRecordTemplateResponse>> listResult = listRecordTemplateId(recordTemplateIdSet);
        List<GetRecordTemplateResponse> getRecordTemplateResponseList = ResultUtils.get(listResult);
        if (!CollectionUtils.isEmpty(getRecordTemplateResponseList)) {
            Map<Long, GetRecordTemplateResponse> getRecordTemplateResponseMap =
                    getRecordTemplateResponseList.stream().collect(Collectors.toMap(GetRecordTemplateResponse::getRecordTemplateId, resp -> resp));
            for (T t : source) {
                Long recordTemplateId = recordTemplateIdGetter.apply(t);
                GetRecordTemplateResponse getRecordTemplateResponse = getRecordTemplateResponseMap.get(recordTemplateId);
                if (!Objects.isNull(getRecordTemplateResponse)) {
                    builder.accept(t, getRecordTemplateResponse);
                }
            }
        }
    }
}
